package com.dmz.etc.task.utils.ftp;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.ftp.Ftp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPFile;

import java.io.IOException;

/**
 * @author lee
 */
@Slf4j
public class FtpUtil {

    public static void upload(FtpFile file) throws IOException {
        //进入远程目录
        //ftp.cd(file.getRemotePath());
        //上传本地文件
        if(file.getFtp().getClient() == null) {
            Ftp init = file.getFtp().init();
            file.setFtp(init);
        }
        file.getFtp().upload(file.getRemotePath(), FileUtil.file(file.getLocalPath()));
        log.info("上传成功{}", file.getFileName());
    }

    public static boolean download(FtpFile file) throws IORuntimeException {
        if(file.getFtp().getClient() == null) {
            Ftp init = file.getFtp().init();
            file.setFtp(init);
        }
        boolean b = file.getFtp().existFile(file.getRemotePath());
        if(b) {
            //下载远程文件
            file.getFtp().download(file.getRemotePath(), FileUtil.file(file.getLocalPath()));
            log.info("下载文件成功{}", file.getFileName());
        }else {
            log.info("无此文件！");
        }
        return b;
    }

    public static void close(Ftp ftp) throws IOException {
        if (ftp != null) {
            ftp.close();
        }
    }

    /**
     * 遍历某个目录下所有文件和目录，不会递归遍历<br>
     * 此方法自动过滤"."和".."两种目录
     *
     * @return boolean
     * @since 5.3.5
     */
    public static boolean remoteExist(FtpFile file) {
        if(file.getFtp().getClient() == null) {
            Ftp init = file.getFtp().init();
            file.setFtp(init);
        }
        try (Ftp ftp = file.getFtp().reconnectIfTimeout()) {
            FTPFile[] ftpFiles = ftp.lsFiles(file.getRemotePath());
            if (ArrayUtil.isEmpty(ftpFiles)) {
                return false;
            }

            String fileName;
            for (FTPFile ftpFile : ftpFiles) {
                fileName = ftpFile.getName();
                if (!StrUtil.equals(".", fileName) && !StrUtil.equals("..", fileName)) {
                    if (fileName.startsWith(file.getFileName()) && fileName.endsWith(file.getEndWith())) {
                       file.setFileName(fileName);
                       return true;
                    }
                }
            }
        }catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return false;
    }
}
